<?php

Yii::import('ext.filters.ajaxauth.AjaxAuthFilter');

class AjaxController extends Controller
{
    public function filters()
    {
	return array(
	    array(
		'ext.filters.ajaxauth.AjaxAuthFilter'
	    )
	);
    }
    public function actionMapUploadRemote()
    {
	$latitude = Yii::app()->request->getParam('latitude');
	$longitude = Yii::app()->request->getParam('longitude');
	$address = Yii::app()->request->getParam('address');
	if (!(double) $latitude || !(double) $longitude) {
	    echo CJSON::encode(array('error' => 'Не указаны координаты'));
	    Yii::app()->end();
	}


	$data = new stdClass();
	$data->latitude = (double) $latitude;
	$data->longitude = (double) $longitude;
	$data->address = $address ? $address : implode(',', array($data->latitude, $data->longitude));
	$data->add_date = date("Y-m-d H:i:s");
	$data->user_id = Yii::app()->user->getId();
	$model = new MapModel();
	$model->setDbData($data);
	if (FactoryService::get('map')->save($model)) {
	    echo CJSON::encode($model->getDbData());
	    Yii::app()->end();
	}
	else {
	    echo CJSON::encode(array('error' => 'Произошла ошибка'));
	    Yii::app()->end();
	}
    }

    public function actionImageUploadRemote()
    {
	$imageUrl = trim(Yii::app()->request->getParam('url'));
	if (!$imageUrl) {
	    echo CJSON::encode(array('error' => 'Нету изображения'));
	    Yii::app()->end();
	}


	$file = UploadManager::getRemoteFile($imageUrl);
	if (!$file) {
	    echo CJSON::encode(array('error' => 'Изображение недоступно'));
	    Yii::app()->end();
	}
	$fileInfo = UploadManager::getRemoteFileInfo($imageUrl);

	if ($fileInfo['http_code'] != 200) {
	    echo CJSON::encode(array('error' => 'Изображение недоступно'));
	    Yii::app()->end();
	}
	$ext = strtolower(substr($fileInfo['content_type'], strpos($fileInfo['content_type'], '/') + 1));

	$userModel = FactoryService::get('user')->get(Yii::app()->user->getId());
	$data = new stdClass();
	$data->real_name = basename($imageUrl);
	$data->thumb_name = FactoryService::get('image')->getThumbName(9, 10) . '.' . $ext;
	$data->path = $userModel->getUploadPath();
	$data->add_date = date("Y-m-d H:i:s");
	$data->user_id = Yii::app()->user->getId();
	$model = new ImageModel($data);		
	try {
	    $id = FactoryService::get('image')->save($model);
	    if ($id) {				
		$originPath = Yii::app()->params['uploadDir'] . DIRECTORY_SEPARATOR . $data->path . DIRECTORY_SEPARATOR . 'origin';		
		$thumbPath = Yii::app()->params['uploadDir'] . DIRECTORY_SEPARATOR . $data->path . DIRECTORY_SEPARATOR . 'thumb';								
		if (!file_exists($originPath)) {
		    mkdir($originPath, 0777, true);
		}
		if (!file_exists($thumbPath)) {
		    mkdir($thumbPath, 0777, true);
		}

		if (file_put_contents($originPath . DIRECTORY_SEPARATOR . $data->real_name, $file)) {
		    $thumbImg = Yii::app()->image->load($originPath . DIRECTORY_SEPARATOR . $data->real_name);
		    $thumbImg->resize(Yii::app()->params['thumbWidth'], Yii::app()->params['thumbHeight'])->save($thumbPath . DIRECTORY_SEPARATOR . $data->thumb_name);
		    echo CJSON::encode(FactoryService::get('image')->get($id)->getDbData());
		    Yii::app()->end();
		}
		echo CJSON::encode(array('error' => 'Произошла ошибка'));
		Yii::app()->end();
	    }
	    else {		
		echo CJSON::encode(array('error' => 'Произошла ошибка'));
		Yii::app()->end();
	    }
	    echo CJSON::encode(array('error' => 'Произошла ошибка'));
	    Yii::app()->end();
	}
	catch (Exception $e) {
	    echo CJSON::encode(array('error' => 'Произошла ошибка'));
		Yii::app()->end();
	    Yii::log($e->getMessage(), CLogger::LEVEL_ERROR);
	}
    }

    public function actionImageUpload()
    {
	$uploadImage = CUploadedFile::getInstanceByName('imageLocal');
	if ($uploadImage->getSize() > Yii::app()->params['maxUploadSize']) {
	    echo CJSON::encode(array('error' => 'Размер файла больше допустимого'));
	    Yii::app()->end();
	}

	if (!in_array(strtolower($uploadImage->getExtensionName()), Yii::app()->params['allowedTypes'])) {
	    echo CJSON::encode(array('error' => 'Недопустимый тип загружаемого файла'));
	    Yii::app()->end();
	}

	try {
	    $userModel = FactoryService::get('user')->get(Yii::app()->user->getId());
	    $data = new stdClass();
	    $data->real_name = $uploadImage->getName();
	    $data->thumb_name = ImageService::getThumbName(7, 10) . '.' . $uploadImage->getExtensionName();
	    $data->path = $userModel->getUploadPath();
	    $data->add_date = date("Y-m-d H:i:s");
	    $data->user_id = Yii::app()->user->getId();
	    $originPath = Yii::app()->params['uploadDir'] . DIRECTORY_SEPARATOR . $data->path . DIRECTORY_SEPARATOR . 'origin';
	    $thumbPath = Yii::app()->params['uploadDir'] . DIRECTORY_SEPARATOR . $data->path . DIRECTORY_SEPARATOR . 'thumb';
	    if (!file_exists($originPath)) {
		mkdir($originPath, 0777, true);
	    }
	    if (!file_exists($thumbPath)) {
		mkdir($thumbPath, 0777, true);
	    }

	    if ($uploadImage->saveAs($originPath . DIRECTORY_SEPARATOR . $data->real_name)) {
		$thumbImg = Yii::app()->image->load($originPath . DIRECTORY_SEPARATOR . $data->real_name);
		$thumbImg->resize(Yii::app()->params['thumbWidth'], Yii::app()->params['thumbHeight'])->save($thumbPath . DIRECTORY_SEPARATOR . $data->thumb_name);
		$model = new ImageModel($data);
		if (FactoryService::get('image')->save($model)) {
		    echo CJSON::encode($model->getDbData());
		    Yii::app()->end();
		}
		else {
		    echo CJSON::encode(array('error' => 'Произошла ошибка'));
		    Yii::app()->end();
		}
	    }
	}
	catch (Exception $e) {
	    echo CJSON::encode(array('error' => $e->getMessage()));
	    Yii::app()->end();
	    Yii::log($e->getMessage(), CLogger::LEVEL_ERROR);
	}
    }

    public function actionVideoUploadRemote()
    {
	$videoUrl = trim(Yii::app()->request->getParam('url'));
	if (!$videoUrl) {
	    echo CJSON::encode(array('error' => 'Нету видеофайла'));
	    Yii::app()->end();
	}

	$fileStatus = UploadManager::getRemoteFileStatus($videoUrl);
	if ($fileStatus != 200) {
	    echo CJSON::encode(array('error' => 'Видеофайл недоступен'));
	    Yii::app()->end();
	}


	$videoType = FactoryService::get('video')->getUrlType($videoUrl);
	if (!$videoType) {
	    echo CJSON::encode(array('error' => 'К сожалению, мы не потдержываем данный сервис'));
	    Yii::app()->end();
	}
	$path = FactoryService::get('video')->getVideoId($videoUrl, $videoType);
	if (!$path) {
	    echo CJSON::encode(array('error' => 'Видео неопознанно'));
	    Yii::app()->end();
	}
	$data = new stdClass();


	$data->real_name = basename($videoUrl);
	$data->url_type = $videoType;
	$data->path = $path;
	$data->add_date = date("Y-m-d H:i:s");
	$data->user_id = Yii::app()->user->getId();
	$model = new VideoModel($data);
	if (FactoryService::get('video')->save($model)) {
	    echo CJSON::encode($model->getDbData());
	    Yii::app()->end();
	}
	else {
	    echo CJSON::encode(array('error' => 'Произошла ошибка'));
	    Yii::app()->end();
	}
    }

    public function actionRemoveAdv()
    {
	$id = Yii::app()->request->getParam('id');
	$type = Yii::app()->request->getParam('type');

	if (!$id || !$type) {
	    echo CJSON::encode(array('error' => 'incorect data'));
	    Yii::app()->end();
	}

	$model = FactoryService::get($type)->get($id);
	if (!$model) {
	    echo CJSON::encode(array('error' => 'there aren\'t such model'));
	    Yii::app()->end();
	}

	if (FactoryService::get($type)->remove($model)) {
	    echo CJSON::encode(array('notice' => 'success'));
	    Yii::app()->end();
	}
	echo CJSON::encode(array('error' => 'can\'t remove object'));
	Yii::app()->end();
    }

    public function actionShowOpinion()
    {
	$id = Yii::app()->getRequest()->getParam('id', false);
	if (!$id) {
	    echo CJSON::encode(array('error' => 'Идентификатор не указан'));
	    Yii::app()->end();
	}
	$model = FactoryService::get('opinion')->get($id);
	if (!$model) {
	    echo CJSON::encode(array('error' => 'Запись не найдена'));
	    Yii::app()->end();
	}

	FactoryService::get('opinion')->getExtendedData($model);
	echo CJSON::encode(array('result' => $this->renderPartial('webroot.themes.' . Yii::app()->theme->name . '.views.partials.opinion', array('model' => $model), true)));
	Yii::app()->end();
    }

    public function actionVote()
    {
	$direction = Yii::app()->getRequest()->getParam('direction');
	$targetId = Yii::app()->getRequest()->getParam('targetId');
	$targetType = Yii::app()->getRequest()->getParam('targetType');

	if (FactoryService::get('vote')->isVoted($targetId, $targetType, Yii::app()->user->getId())) {
	    echo CJSON::encode(array('error' => 'Вы уже голосовали за него'));
	    Yii::app()->end();
	}

	$targetModel = FactoryService::get($targetType)->get($targetId);
	if (!$targetModel) {
	    echo CJSON::encode(array('error' => 'Не найден объект за который Вы голосуете'));
	    Yii::app()->end();
	}
	if ($targetModel->getDbData('user_id') == Yii::app()->user->getId()) {
	    echo CJSON::encode(array('error' => 'Вы не можете голосовать за свое'));
	    Yii::app()->end();
	}

	$vote = array(
	    'target_id' => $targetId,
	    'target_type' => $targetType,
	    'user_id' => Yii::app()->user->getId(),
	    'direction' => $direction
	);		
	if (FactoryService::get('vote')->save(new VoteModel((object) $vote))) {	    	    	    
	    $targetModel->rating += $direction;	       
	    $voteClass = '';
	    $ratingChar = '';
	    if ($targetModel->rating > 0) {
		$voteClass = 'green';
		$ratingChar = '+';
	    }
	    elseif ($targetModel->rating < 0) {
		$voteClass = 'red';
	    }	    
	    if (FactoryService::get($targetType)->save($targetModel)) {
		Rating::vote($targetModel, $direction);
		echo CJSON::encode(array('targetId' => $targetId, 'targetType' => $targetType,
		    'rating' => '<b class="' . $voteClass . '">' . $ratingChar . $targetModel->rating . '</b>'
		));
		Yii::app()->end();
	    }
	}
	echo CJSON::encode(array('error' => 'Произошла ошибка'));
	Yii::app()->end();
    }

}